#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
//#define TMP_FILE  "/tmp/.ifconfig.log"
#define TMP_FILE  "text.txt"

int main()
{
	pid_t       pid;
	int         fd;
	char        buf[1024];
	int         rv;
	char       *ptr;
	FILE       *fp;
	char       *ip_start;
	char       *ip_end;
	char        ipaddr[16];

	if( (fd=open(TMP_FILE, O_RDWR|O_CREAT|O_TRUNC, 0644)) < 0 )
	{
		printf("Redirect standard output to file failure: %s\n", strerror(errno));
		return -1;
	}

	/*pid = fork();
	 if(pid < 0)
	
	 {

		 printf("fork() create child process failure: %s\n", strerror(errno));

		 return -1;

	 }

	 else if( pid == 0 ) //子进程开始运行

	 {
		 printf("Child process start excute ifconfig program\n");
			      
	      	 dup2(fd, STDOUT_FILENO); //重定向标准输出到fd,即将屏幕输出的内容输入到fd中
			       
		 execl("/sbin/ifconfig", "ifconfig", "ens33", NULL); 
			
		 printf("Child process excute another program, will not return here. Return here means execl() error\n");
			     
		 return -1;
			      
	 }
			      
	 else
			      
	 {
			      //                         // 父进程等待3s，让子进程先执行
			      
		 sleep(3);
			     
	 } // 子进程因为调用了execl(), 它会丢掉父进程的文本段，所以子进程不会执行到这里了。只有父进程会继续执行这后面的代码
	*/	
	         dup2(fd, STDOUT_FILENO); 
	         system("ifconfig");
		 memset(buf, 0, sizeof(buf));

			      //                             // 父进程这时候读是读不到内容的，这时因为子进程往文件里写内容时已经将文件偏移量修改到文件尾了
			      
		 rv=read(fd, buf, sizeof(buf));
			      
		 printf("Read %d bytes data dierectly read after child process write\n",rv);                                // 父进程如果要读则需要将文件偏移量设置到文件头才能读到内容
			      
	   	 memset(buf, 0, sizeof(buf));
			      
		 lseek(fd, 0, SEEK_SET);
			      
		 rv=read(fd, buf, sizeof(buf));
			     
		 printf("Read %d bytes data after lseek:\n %s", rv, buf);
			      //                                     // 如果使用read()读的话，一下子就读 N 多个字节进buffer,buf大小不好定义，所以有时我们希望一行一行地读取文件的内容这样buf可以定义小一点足够读取一行文件内容即可，用fget（）函数，但fget函数需要文件指针这个参数，用fdopen可以将fd转换成指针fp
                          
      //		 fdopen()函数将文件描述符fd转成文件流fp
			      
		 fp = fdopen(fd, "r");
			      
		 fseek(fp, 0, SEEK_SET); // 重新设置文件偏移量到文件头
			      
		 while( fgets(buf, sizeof(buf), fp) ) // fgets()从文件里一下子读一行，如果读到文件尾则返回NULL,开始循环
			      
		 {	    	 
			 if( strstr(buf, "netmask") )  //fget当前读到的行是否有“netmask”
			 {
				 ptr=strstr(buf, "inet");    //fget当前读到的行是否月“inet”
				 if( !ptr)//如果fget当前读到的行有“netmask”，但是没有“inet”，break
				 {
					 break;//？
				 }
				 ptr += strlen("inet");

				 while( isblank(*ptr) )//如果当前指针首地址的值为空格或tab，++。
					 ptr++;

				 ip_start = ptr;
				 while( !isblank(*ptr) )//如果当前指针首地址的值不是空格或tab，++。
					 ptr++;
				
				 ip_end = ptr;
				 memset(ipaddr, 0, sizeof(ipaddr));
				 memcpy(ipaddr, ip_start, ip_end-ip_start);//将ip_start内容复制给ipaddr，内容大小为ip_end-ip_start
				 break;    
			 }
		 }
			      
		 printf("Parser and get IP address: %s\n", ipaddr);  
		 fclose(fp);
		 //unlink(TMP_FILE);    
		 return 0;			      
}
